package com.endurance.controller;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: sunlin
 * @Date: 2024-04-18 8:11
 * @Version: 1.0
 * @Description: 测试Hystrix
 */
@RestController()
@RequestMapping("/hystrix")
@DefaultProperties(defaultFallback = "defaultFallback")
public class HystrixController {

    @GetMapping
    @HystrixCommand(fallbackMethod = "fallbackMethod")
    public String demo(@RequestParam Integer id) {
        System.out.println("demo ok:" + id);
        // 如果抛出异常就会执行降熔断方法
        if (id <= 0) throw new RuntimeException("无效的id");
        return "id大于0，服务正常执行！";
    }

    @GetMapping("/demo2")
    @HystrixCommand
    public String demo2(@RequestParam Integer id) {
        System.out.println("demo ok:" + id);
        // 如果抛出异常就会执行降熔断方法
        if (id <= 0) throw new RuntimeException("无效的id");
        return "id大于0，服务正常执行！";
    }


    /**
     * 断路器：默认打开条件： 当10s内如果有20个请求失败，或者50%请求失败，自动触发断路器自动打开
     * 当断路器打开5s以后断路器会进入半开状态，如果请求成功会关闭断路器
     *
     * @param id
     * @return
     */
    public String fallbackMethod(Integer id) {
        return id + "不合法，执行熔断方法！";
    }

    public String defaultFallback() {
        return "id不合法，执行熔断方法！-defaultFallback";
    }

}
